
package com.svh.Controlador;

import com.svh.Entidad.Empleado;
import com.svh.Entidad.Producto;
import com.svh.Paginator.Paginador;
import com.svh.Paginator.ProductoPaginador;
import com.svh.Servicios.ProductoServicio;
import com.svh.Utils.ExcelExporter;
import com.svh.Utils.Exporter;
import com.svh.Utils.Utilitario;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author Luis Alonso Ballena Garcia
 */
@ManagedBean(name = "productoControlador")
@ViewScoped
public class ProductoControlador {
    Producto producto;
    LazyDataModel<Producto> productos;
    ProductoServicio productoServicio;
    @ManagedProperty("#{sesionControlador}")
    SesionControlador sesionControlador;
    
    public ProductoControlador()
    {
    
    }
    
    public void initLista()
    {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            productos = new Paginador<Producto>(new ProductoPaginador());
            sesionControlador.generarModulo(6);/** NUMERO MAGICO T_T **/
        }
    }
    
    public void initRegistro()
    {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            producto = new Producto();       
        }
    }
    
    public void initUpdate()
    {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            Object parametro = Utilitario.getFlash("idProducto");
            if (parametro == null) {
                Utilitario.redireccionarJSF(FacesContext.getCurrentInstance(), "/views/producto/list.xhtml");
                return;
            }
            productoServicio = new ProductoServicio();
            producto = productoServicio.obtenerProducto((Integer)parametro);
        }
    }
    
    public void registrar()
    {
        if(!esVistaValida())
        {
            return;
        }
        productoServicio = new ProductoServicio();
        productoServicio.registrarProducto(producto);
        limpiar();
    }
    
    public void actualizar()
    {
        if(!esVistaValida())
        {
            return;
        }
        productoServicio.actualizarProducto(producto);
    }
    
    public String irActualizar(int id)
    {
        Utilitario.putFlash("idProducto", id);
        return "update.xhtml?faces-redirect=true";
    }
    
    private boolean esVistaValida()
    {
        boolean resultado = true;
        if(!esNombreValido()){
            resultado = false;
        }else if(!esDescripcionValida()){
            Utilitario.enviarMensajeGlobalError("El máximo de caracteres para la Descripción es 200");
            resultado = false;
        }
        return resultado;
    }
    
    private boolean esNombreValido()
    {
        boolean resultado = true;
        if(Utilitario.esNulo(producto.getNombre()))
        {
            Utilitario.enviarMensajeGlobalError("Debe ingresar el Nombre");
            resultado = false;
        }else if(!Utilitario.esRangoValido(producto.getNombre(),45))
        {
            Utilitario.enviarMensajeGlobalError("El máximo de caracteres para el Nombre es 45");
            resultado = false;
        }
        return resultado;
    }
    
    private boolean esDescripcionValida()
    {
        return Utilitario.esRangoValido(producto.getDescripcion(),200);
    }
    
    private void limpiar()
    {
        producto = new Producto();
    }
    
    public void exportar(){
        List<Exporter> datos = ((Paginador)productos).getAllList();
        ExcelExporter da = new ExcelExporter(Producto.class);
        da.agregarHeader("productos");
        da.crearDocumento(datos);
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext = ExcelExporter.getResponseContent(externalContext,"Lista_productos");
        try {
            OutputStream outputStream = externalContext.getResponseOutputStream();
            da.exportarDocumento(outputStream);
            externalContext.setResponseStatus(200);
            externalContext.responseFlushBuffer();
            facesContext.responseComplete();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    /** GETTERS AND SETTERS **/
    
    public Producto getProducto() {
        return producto;
    }

    public void setProducto(Producto producto) {
        this.producto = producto;
    }

    public LazyDataModel<Producto> getProductos() {
        return productos;
    }

    public void setProductos(LazyDataModel<Producto> productos) {
        this.productos = productos;
    }

    public void setSesionControlador(SesionControlador sesionControlador) {
        this.sesionControlador = sesionControlador;
    }

    
    
}
